剑指offer 55.链表中环的入口结点

剑指offer 55.链表中环的入口结点

题目

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路

现在成了数学题了,首先设快慢两点都在开头,快结点一下走两步,慢结点一下走一步,当快结点追上慢结点就代表存在环。
当二者相遇,快结点回到开头,慢结点继续走,当二者再次相遇时,结点就为环的入口结点。记得要考虑到没有下一个结点的可能性。
数学问题我就不证明了,画一个图就能理解了。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class ListNode {

int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}

public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode fast = pHead;
ListNode slow = pHead;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
fast = pHead;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
---本文结束,感谢阅读---